﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include <string>
#include "OwnerPtr.h"
#include "IJournalData.h"
#include "GcmpJournalInterface.h"

namespace gcmp
{
    #define JOURNAL_RESULT_TEXT_SEPARATOR L"\v" /// 文本数组类型的检查点数据的间隔符

    /// \brief 结果数据类型
    /// 
    /// 结果数据的声明查看IJournalCheckData
    enum class JournalCheckDataType : int32_t
    {
        Invalid = 0, /// 无效数据
        Int, /// int类型数据
        Double, /// double类型数据
        Text, /// 文本类型数据
        Text_LIST, /// 文本数组类型数据，以m_textSeparator为间隔的文本串，比如“a\vb\vc”，数组内值的存储顺序对比较结果没有影响，“a\vb\vc”=“c\vb\va”
        Picture, /// 图片类型数据
        Dxf, /// CAD数据文件类型数据
        PDF, /// PDF数据文件类型数据
        DWG_XData, /// DWG的xdata
        NumberOfTypes /// 类型个数
    };

    /// \brief 日志录制回放数据：结果数据
    ///
    /// 结果数据表示程序运行过程中产生的各种结果
    /// ，用户可以选择录制产生的结果，回放时日志会比较录制的结果值与回放时产生的结果值是否相等
    /// ，若相等表示回放正确，否则表示回放时程序没有按照期望情景运行，回放失败，提示用户并停止回放
    class GCMP_JOURNAL_INTERFACE_EXPORT IJournalCheckData : public IJournalData
    {
    public:
        virtual ~IJournalCheckData() {}

        /// \brief 创建一个IJournalCheckData实例
        ///
        /// \return IJournalCheckData实例
        static gcmp::OwnerPtr<IJournalCheckData> Create();

        /// \brief 设置结果数据的名字
        ///
        /// \param[in] name 结果数据的名字
        /// \return 运行结果，true成功，false失败
        virtual bool SetName(const std::wstring &name) = 0;

        /// \brief 获取结果数据的名字
        ///
        /// \return 结果数据的名字
        virtual std::wstring GetName() = 0;

        /// \brief 设置结果数据
        ///
        /// \param[in] result 结果数据
        /// \return 运行结果，true成功，false失败
        virtual bool SetData(int result) = 0;

        /// \brief 设置结果数据
        ///
        /// \param[in] result 结果数据
        /// \return 运行结果，true成功，false失败
        virtual bool SetData(double result) = 0;

        /// \brief 设置结果数据
        ///
        /// \param[in] result 结果数据
        /// \param[in] resultType 结果数据类型
        /// \return 运行结果，true成功，false失败
        virtual bool SetData(const std::wstring& result, JournalCheckDataType resultType) = 0;

        /// \brief 获取结果数据
        ///
        /// \param[out] result 结果数据
        /// \param[out] resultType 结果数据类型
        /// \return 运行结果，true成功，false失败
        virtual bool GetData(std::wstring &result, JournalCheckDataType &resultType) = 0;

        /// \brief 获取结果数据类型
        ///
        /// \return 结果数据类型
        virtual JournalCheckDataType GetCheckDataType() const = 0;

        /// \brief 检验与传入（日志）结果数据是否相等
        ///
        /// \param[in] otherResult 传入结果数据
        /// \param[out] logMessage 备注信息，用于获取比较结果的详细信息
        /// \return 运行结果，true成功，false失败
        virtual bool EqualTo(IJournalCheckData *otherResult, std::wstring& logMessage) = 0;
    };
}

